package com.example.exception.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class UserController {

    @GetMapping("/generateException")
    public String generateException() {
        String str = null;
        int length = str.length();
        return "/homePage";
    }

    @GetMapping("/arithmeticExceptionByUser")
    public String arithmeticExceptionByUser() {
        int i = 10 / 0;
        return "/homePage";
    }


    /**
     * 当出现注解指定的异常（可以指定多个异常，然后同时跳转）的时候，跳转ModelAndView对象指定的视图
     *
     * @param e
     * @return
     * @ExceptionHandler 使用这个注解的要求
     * 1.这个注解修饰的方法需要返回ModelAndView对象
     * 2.方法需要传入参数Exception e
     * 3.注解的value 需要指定至少一个 继承/实现 Throwable 接口的类(需要全限定路径)
     * 4.只能处理和本注解所在Controller的异常，对于其他Controller产生的异常，则没有办法
     */
    //@ExceptionHandler(value = {java.lang.NullPointerException.class})
    public ModelAndView nullPointerExceptionHandler(Exception e) {
        ModelAndView modelAndView = new ModelAndView("/exceptionPage");
        modelAndView.addObject("exception", e.toString());
        modelAndView.addObject("stackTrace", e.getStackTrace());
        modelAndView.addObject("errorInfo", "空指针异常");
        modelAndView.addObject("errorMessage", e.getMessage());
        modelAndView.addObject("cause", e.getCause());
        return modelAndView;
    }


}
